package default_package;

import java.util.TreeMap;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

public class Utilisateur {
	
	
	private String login;
	private String mdp;
	
	private String nom;
	private String prenom;
	
	
	private enum Genre {Homme, Femme};
	private Genre sexe;
	private enum TypeCompte {Interprete, Locuteur};
	private TypeCompte type;
	private Langue langueMaternelle;
	
	
	public enum Statut {Hors_Ligne, Disponible, En_Communication};
	private Statut statut;
	
	// Attributs d'association
	private TreeMap<String,Langue> languesParlees;
	
	public Utilisateur(String login, String mdp, String nom, String prenom, String sexe,String type, String langueMaternelle, TreeMap<String, String> languesParlees) {
		super();
		setStatut(Statut.Hors_Ligne);
		setLogin(login);
		setMdp(mdp);
		setNom(nom);
		setPrenom(prenom);
		setSexe(sexe);
		this.langueMaternelle= new Langue(langueMaternelle);
		//System.out.println("taille dansl'utilisateur : " + languesParlees.size() );
		if(type.equals("Interprete")) {
			setLanguesParlees(new TreeMap<String, Langue>());
			for(String s : languesParlees.values()) {
				ajouterLangue(new Langue(s));	
			}
		}
		setType(type);
	}
	
	public Utilisateur(String login, String mdp, String nom, String prenom, String sexe,String type , Statut statut,  String langueMaternelle,TreeMap<String,Langue> langues){
		super();
		setStatut(statut);
		setLogin(login);
		setMdp(mdp);
		setNom(nom);
		setPrenom(prenom);
		setSexe(sexe);
		setType(type);
		this.langueMaternelle= new Langue(langueMaternelle);
		setLanguesParlees(langues);
		
	}
	
	public Utilisateur(String login, String mdp, String nom, String prenom, String sexe,TypeCompte type , Statut statut,  String langueMaternelle,TreeMap<String,Langue> langues){
		super();
		setStatut(statut);
		setLogin(login);
		setMdp(mdp);
		setNom(nom);
		setPrenom(prenom);
		setSexe(sexe);
		setType(type);
		this.langueMaternelle= new Langue(langueMaternelle);
		setLanguesParlees(langues);
		
	}
	
	public Utilisateur(String login, String mdp, String nom, String prenom, String sexe,String type,String langueMaternelle) {
		super();
		setStatut(Statut.Hors_Ligne);
		setLogin(login);
		setMdp(mdp);
		setNom(nom);
		setPrenom(prenom);
		setSexe(sexe);
		setType(type);
		this.langueMaternelle= new Langue(langueMaternelle);
		setLanguesParlees(new TreeMap<String, Langue>());
	}

	public Statut getStatut() {
		return statut;
	}


	public void setStatut(Statut statut) {
		this.statut = statut;
	}


	public String getLogin() {
		return login;
	}
	
	public void setLogin(String login) {
		this.login = login;
	}
	
	public void setLangueMaternelle(String langueMaternelle) {
		this.langueMaternelle.setNom(langueMaternelle);
	}
	
	public String getLangueMaternelle() {
		return langueMaternelle.getNom();
	}
	
	public String getMdp() {
		return mdp;
	}
	
	public void setMdp(String mdp) {
		this.mdp = mdp;
	}
	
	
	public String getNom() {
		return nom;
	}
	
	public void setNom(String nom) {
		this.nom = nom;
	}
	
	public TypeCompte getType() {
		return type;
	}
	
	public void setType(String type) {
		if(type.equals("Interprete")) {
			this.type = TypeCompte.Interprete;
		} else {
			this.type = TypeCompte.Locuteur;
		}
	}
	
	public void setType(TypeCompte type) {
		this.type=type;
	}
	
	public String getPrenom() {
		return prenom;
	}
	
	public void setPrenom(String prenom) {
		this.prenom = prenom;
	}
	
	
	public String getSexe() {
		return sexe.toString();
	}
	
	public void setSexe(String sexe) {
		if(sexe.equals("Femme")) {
			this.sexe = Genre.Femme;
		} else {
			this.sexe = Genre.Homme;
		}
	}

	
	public TreeMap<String,Langue> getLanguesParlees() {
		return languesParlees;
	}
	
	public void setLanguesParlees(TreeMap<String,Langue> languesParlees) {
		this.languesParlees=languesParlees;
	}
	
	public void ajouterLangue(Langue l) {
		this.languesParlees.put(l.getNom(),l);
	}
	
	public Utilisateur clone() {
		return new Utilisateur(this.getLogin(), this.getMdp(), this.getNom(), this.getPrenom(), this.getSexe(),this.getType(), this.getStatut(), this.getLangueMaternelle(),this.getLanguesParlees());
	}
	
	
	public void sauver(Connection cn)
	{
		Statement st=null; 
		try {
			st = cn.createStatement();
			String sql = "INSERT INTO `Compte` (`login`,`nom`,`prenom`,`sexe`, `mdp`,`nationalite`,`type`)  VALUES ('"
				+ getLogin()+ "' , '" + getNom()+ "' , '" + getPrenom()+ "','" + getSexe()+ "','" + getMdp()+ "','" + getLangueMaternelle()+ "','" + getType()+ "')";
			st.execute(sql);
			if (getType().equals(TypeCompte.Interprete)) {
				sql = "INSERT INTO `LanguesParlees` (`login`,`langue`) VALUES ";
				for(Langue s : getLanguesParlees().values()){
					sql+= "( '" + getLogin() + "' , '" + s.getNom() + "'";
					if (!getLanguesParlees().lastKey().equals(s.getNom())){
						sql+=" ) , ";
					}else{
						sql+=")";
					}
				}
				st.execute(sql);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}	
	}
	
	public void update(Connection cn)
	{
		Statement st=null; 
		String sql = "";
		try {
			st = cn.createStatement();
			
			sql = "delete from LanguesParlees WHERE login = '" + getLogin() + "'";
			st.execute(sql);
			
			sql = "UPDATE `Compte` SET type= '"+getType()+"' WHERE login = '" + getLogin() + "'";
			st.executeUpdate(sql);
			
			if (getType().equals(TypeCompte.Interprete)){
				sql = "INSERT INTO `LanguesParlees` (`login`,`langue`) VALUES ";
				for(Langue s : getLanguesParlees().values()){
					sql+= "( '" + getLogin() + "' , '" + s.getNom() + "'";
					if (!getLanguesParlees().lastKey().equals(s.getNom())){
						sql+=" ) , ";
					}else{
						sql+=")";
					}
				}
				//System.out.println(sql);
				st.execute(sql);

			}
		} catch (SQLException e) {
			e.printStackTrace();
		}	
	}
}
